// Promise.all 它接收一个 Promise 数组，并返回一个新的 Promise。
// 这个新 Promise 在所有输入的 Promise 都成功完成时才会 resolve，
// 返回一个包含所有结果的数组；
// 如果任何一个 Promise 被 reject，则立即 reject。

function promiseALL(promises) {
  return new Promise((resolve, reject) => {
    // 如果输入不是数组，可以转换为数组或抛出错误
    if (!Array.isArray(promises)) {
      return reject(new TypeError('Arguments must be an array'))
    }

    const results = []
    let count = 0
    const total = promises.length

    // 如果数组为空，立即resolve空数组
    if (total === 0) {
      return resolve(results)
    }

    promises.forEach((promise, index) => {
      // 确保处理的是Promise对象（处理非Promise值）
      Promise.resolve(promise)
        .then(result => {
          results[index] = result;
          count++;

          // 当所有Promise都完成时resolve结果数组
          if (count === total) {
            resolve(results)
          }
        })
        // 任何一个Promise reject，立即reject整个Promise.all
        .catch(error => {
          reject(error)
        })
    });
  });
}